package com.zzl.bonds.ticket.feign;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zzl.apidoc.annotation.ApidocOperation;
import com.zzl.apidoc.annotation.ApidocParam;
import com.zzl.bonds.ticket.dto.feign.ApprovalAddDto;
import com.zzl.bonds.ticket.dto.feign.ApprovalSubmitDto;
import com.zzl.general.common.apidoc.annotation.ApidocReturnR;
import com.zzl.general.common.exception.SysException;
import com.zzl.general.common.feign.config.FeignClientsConfig;
import com.zzl.general.common.requestparameter.StringIds;
import com.zzl.general.common.utils.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * rpc 接口
 *
 * @author : spp
 * @date : 2021/11/19 14:23
 */
@FeignClient(value = "process", configuration = FeignClientsConfig.class)
public interface ProcessFeign {


    /**
     * 1. 当前登录用户的 enterpriseId
     * 2. 通过审批类型 & enterpriseId 找到当前类型的可用模板
     * 3. 根据模板创建 审批流程 copy temp node user
     * 4. 返回该 审批流程 的 approvalId
     */
    @PutMapping("/feign/startProcess")
    Result save(@RequestBody ApprovalAddDto addDto);

    /**
     * 1. 当前登录用户的 enterpriseId
     * 2. 通过审批类型 & enterpriseId 找到当前类型的可用模板
     * 3. 根据模板创建 审批流程 copy temp node user
     * 4. 返回该 审批流程 的 approvalId
     */
    @PutMapping("/feign/saveBath")
    Result saveBath(@RequestBody List<ApprovalAddDto> addDto);

    /**
     * 批量发起审批流程
     *
     * @param addDto 流程参数
     * @return 返回值
     */
    @PutMapping("/feign/saveBachApproval")
    @ApidocOperation(description = "批量发起业务审批流", operationId = "saveBachApproval2")
    @ApidocReturnR
    Result saveBachApprovalProcess(@ApidocParam(name = "参数对象", required = true) @RequestBody ApprovalAddDto addDto);

    /**
     * 根据 审批id 判断该用户 是否有 去审批的 权限
     *
     * @param approvalIds 审批id 集合
     * @return 权限结果
     */
    @PostMapping("/feign/getApprovalAuth")
    Result getApprovalAuth(@RequestBody List<String> approvalIds);

    /**
     * 获取开立 页面的 前序审批人 和当前审批人
     *
     * @param approvalId 审批id
     * @return 返回审批人数据
     */
    @PostMapping("/feign/getApUserShow/{approvalId}")
    Result getApUserShow(@PathVariable("approvalId") String approvalId) throws SysException;

    /**
     * 获取审批流程下的 审批人列表
     *
     * @param approvalId 审批id
     * @return 返回审批人数据
     */
    @PostMapping("/feign/getOpenProcessList/{approvalId}")
    Result getOpenProcessList(@PathVariable("approvalId") String approvalId) throws SysException;

    /**
     * 获取审批流程下的 审批人列表
     *
     * @param approvalId 审批id
     * @return 返回审批人数据
     */
    @PostMapping("/feign/cancel/{approvalId}")
    Result cancel(@PathVariable("approvalId") String approvalId) throws SysException;

    /**
     * 提交审核结果
     *
     * @param submitDto 提交审核的 对象值
     * @return 提交结果
     * @throws SysException 业务异常
     */
    @PostMapping("feign/processSubmit")
    Result processSubmit(@RequestBody ApprovalSubmitDto submitDto) throws SysException;


    /**
     * 当 进入预兑付 停止流程
     */
    @PostMapping("feign/stopApproval")
    Result stopApproval(@RequestBody List<String> approvalIds);

    /**
     * 根据审批id 查询该审批流程的所有用户
     *
     * @param approvalIds 审批ids
     * @return 审批用户的 ids
     */
    @PostMapping("/feign/getAllUserByApprovalId")
    @ApidocOperation(description = "根据审批id 查询该审批流程的所有用户", operationId = "cancel5")
    List<String> getAllUserByApprovalId(@RequestBody StringIds approvalIds);

    /**
     * 生成的流程进行回滚
     * 1. 删除流程 2. 删除流程节点 3. 删除审批用户
     */
    @PostMapping("/rollbackApproval/{approvalId}")
    @ApidocOperation(description = "根据流程id 回滚生成的审批流程数据", operationId = "rollbackApproval")
    Result rollbackApproval(@PathVariable("approvalId") String approvalId);

    /**
     * 获取当前用户需要审批的申请id
     */
    @PostMapping("feign/getByReviewer")
    List<String> getByReviewer(@RequestBody JSONObject jsonObject);

    /**
     * 获取改流程已完成用户和待审批用户的ids
     *
     * @param approvalId 审批id 集合
     * @return 权限结果 全量返回 审批流程id 对应的结果 isShow 0 无权限 1 有权限
     */
    @GetMapping("feign/getAllAuditUserIds/{approvalId}")
     List<String> getAllAuditUserIds(@ApidocParam(name = "流程id", required = true) @PathVariable("approvalId") String approvalId) throws SysException;
}